#pragma once
#include "TokenList.h"
#include "types.h"
#include "SymbolTable.h"
#include <stdio.h>

eType interpretNumericType(char *string);
int match(eTokenType tokenType, eTokenType *followList);
int matchType(eType expectedType, eType typeToCheck, const Token *token);
int matchKinds(int expectedKind, eKind kindToCheck);
int isDefined(SymbolTableEntry *entry, const Token *token);
int isRedefined(SymbolTableEntry *entry, const Token *token);
int attemptRepairKeyword(Token *token, eTokenType expectedTokenType);
int existsInFollow(eTokenType type, eTokenType *followList);
void gotoFollow(eTokenType *followList);
void initializeOutput();
void setOutputTarget(FILE *target);
void outputLine(char *string);
void outputRule(int rule);
void outputLexicalError(const Token *token, eTokenType *expectedTokenTypes);
void outputLexicalWarning(const Token *token, eTokenType *expectedTokenTypes);
void outputLexicalMessage(const char *message, const Token *token, eTokenType *expectedTokenTypes);